using System;
using System.Collections.Generic;
using System.Text;
using PuenteInterfase;
using System.Windows.Forms;
using Juego.Puente;
using Juego.Controlador;

namespace Vista
{
    public delegate void DelAlPresionarseUnaTecla(KeyEventArgs e);

    public class vistaGuitarra
    {
		private Dictionary<int, Label> _bloques;
		private frmGuitarra _ventana;
        //private IList<BloqueaTocar> _bloquesenjuego;
        //public event DelAlPresionarseUnaTecla AlPresionarseUnaTecla;
        private ControladorJuego _controlador;
        private ControladorTeclado _teclado;

        public event DelAlPresionarseUnaTecla TeclaBajada;

        public vistaGuitarra(ControladorJuego controlador, ControladorTeclado teclado)
        {
            // inicializamos nuestras variables 
            _bloques = new Dictionary<int, Label>();
            _ventana = new Vista.frmGuitarra();
            _controlador = controlador;
            _teclado = teclado;
            _ventana.KeyPreview = true;
            _ventana.Visible = true;
            
            _ventana.Activate();
            _ventana.Select();
            //_ventana.KeyDown += new KeyEventHandler(_ventana_KeyDown);

			// seleccionamos que eventos son los que 
			// vamos a escuchar del juego (o sea 
			// que eventos son los que vamos a dibujar)
			_controlador.AlAgregarseUnBloque += new DelAlAgregarseUnBloque(juego_AlAgregarseBloque);
			_controlador.AlMoverseUnBloque += new DelAlMoverseUnBloque(juego_AlMoverseUnBloque);
			_controlador.AlBorrarseUnBloque += new DelAlBorrarseUnBloque(juego_AlBorrarseUnBloque);
			_controlador.AlPresionarBienLaCuerda += new DelAlPresionarBienLaCuerda(_controlador_AlPresionarBienLaCuerda);
			_controlador.AlPresionarMalLaCuerda += new DelAlPresionarMalLaCuerda(_controlador_AlPresionarMalLaCuerda);

			_teclado.SetearFuenteTeclado(_ventana);
            
        }

		void _controlador_AlPresionarBienLaCuerda(int puntos)
		{
			_ventana.EtiquetaPuntos.Text = puntos.ToString();
			_ventana.EtiquetaFallaste.Text = "";
			_ventana.EtiquetaFallaste.Refresh();
			_ventana.EtiquetaPuntos.Refresh();
		}

		void _controlador_AlPresionarMalLaCuerda()
		{
			_ventana.EtiquetaFallaste.Text = "Fallastes!!!";
			_ventana.EtiquetaPuntos.Refresh();
		}

		/*
        void _ventana_KeyDown(object sender, KeyEventArgs e)
        {
            TeclaBajada = new DelAlPresionarseUnaTecla(_teclado._elcontrolador_AlPresionarseUnaTecla);
            TeclaBajada(e);
        }
		 * */

        /*public frmGuitarra FormularioGuitarra
        {
            get { return this._ventana; }
        }
        */

		void juego_AlBorrarseUnBloque(BloqueaTocar bloque)
		{
			Label lbl = _bloques[bloque.Id];
			_ventana.Controls.Remove(lbl);
			_bloques.Remove(bloque.Id);

			_ventana.Refresh();
            _ventana.Select();
		}

		void juego_AlMoverseUnBloque(BloqueaTocar bloque)
		{
			// aca esta el codigo que mueve la "vista" del bloque
			// qeu nos digan que se movio

			// agarramos la representacion grafica del bloque a mover
			// que se supone que vamos a tocar
			Label lbl = _bloques[bloque.Id];
			lbl.Location = new System.Drawing.Point (lbl.Location.X, _ventana.LineaBaseBloques + (int)bloque.PosicionY);
			lbl.Refresh();
			lbl.Text = lbl.Location.Y.ToString();
            _ventana.Select();
			Application.DoEvents();       
			//System.Diagnostics.Debug.WriteLine(bloque.Id.ToString() + ", " + bloque.PosicionY.ToString());
		}

		void juego_AlAgregarseBloque(BloqueaTocar bloque)
		{
			// aca colocamos el codigo para 
			// agregar visualmente un nuevo bloque
            
			Label lbl = new Label();
			lbl.Location = new  System.Drawing.Point (_ventana.PosicionIesimaCuerda(bloque.CuerdaASerLanzado), _ventana.LineaBaseBloques);
			lbl.BackColor = System.Drawing.Color.Blue;
			lbl.Width = 46;
			lbl.Height = 26;
			_ventana.Controls.Add(lbl);
			_ventana.Refresh();
            
            _ventana.Select();
			// la agregamos a nuestra coleccion de elementos
			// para que despues podamos animarla
			// cuando nos dicen que se tiene que mover
			_bloques.Add(bloque.Id, lbl);
		}
    }
}
